#include <Python.h>

static PyObject *py_example_do(PyObject *self, PyObject *args) {
  int num;
  // 解析参数，具体参考官方文档
  if (!PyArg_ParseTuple(args, "i", &num)) {
    return NULL;
  }
  // todo

  // 创建py类型结果
  PyObject *result = PyTuple_New(1);
  PyTuple_SetItem(result, 0, PyLong_FromLong(num));
  return result;
}

// 下面是三个包装
// 模块方法，模块定义，初始化函数

// 模块的方法
// example_do是py调用的方法名称，py_example_do为c函数，更多参考官方文档
static PyMethodDef ExampleMethods[] = {
    {"example_do", py_example_do, METH_VARARGS, "example do something"},
    {NULL, NULL, 0, NULL} // Sentinel
};

// 模块定义
// 模块名是非常重要的一点，它必须与下面的初始化函数相同
// PyInit_modelname
static struct PyModuleDef exampl_model = {
    PyModuleDef_HEAD_INIT,
    "example", // 模块名
    NULL,      // 模块文档，NULL表示没有文档
    -1,        // 模块保持状态，-1表示模块是全局的
    ExampleMethods};

// 初始化函数
// 该函数仅会在初始化调用一次，可以在这里做一些关于c的初始化
// 注意init不会被调用，仅会调用初始化函数以及对外提供的一些模块方法
PyMODINIT_FUNC PyInit_example(void) { return PyModule_Create(&exampl_model); }